package com.crscd.config;

import cn.hutool.crypto.SecureUtil;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.document.Document;
import org.springframework.ai.reader.TextReader;
import org.springframework.ai.transformer.splitter.TokenTextSplitter;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.data.redis.core.RedisTemplate;

import java.nio.charset.Charset;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @author： liuziyang
 * @date： 2025/10/8-19:22
 * @description：
 * @modifiedBy：
 * @version: 1.0
 */
@Slf4j
@Configuration
public class InitVectorDatabaseConfig {
  @Autowired private VectorStore vectorStore;
  @Autowired private RedisTemplate<String, String> redisTemplate;

  @Value("classpath:ops.txt")
  private Resource opsFile;

  @PostConstruct
  public void init() {
    // 1. 读取文件
    TextReader reader = new TextReader(opsFile);
    reader.setCharset(Charset.defaultCharset());
    // 2. 文件转换为向量（开启分词）
    final List<Document> documentList = new TokenTextSplitter().transform(reader.read());
    // 4. 去重复版本
    final String sourceMetadata = (String) reader.getCustomMetadata().get("source");
    String textHash = SecureUtil.md5(sourceMetadata);
    String redisKey = "vector-xxx:" + textHash;

    // 判断是否存入过，redis key，如果可以成功插入表示没有过，可以加入向量数据
    final Boolean retFlag = redisTemplate.opsForValue().setIfAbsent(redisKey, "1");
    log.info("retFlag:{}", retFlag);
    if (Boolean.TRUE.equals(retFlag)) {
      // 存入成功，可以加入向量数据
      // 3. 写入向量数据库RedisStack中
      vectorStore.add(documentList);
      log.info("向量初始化数据成功");
    } else {
      log.info("向量初始化数据已经加载过，请不要重复加载");
    }
  }
}
